//monte carlo usando treads :http://codigofonte.uol.com.br/codigo/outras-linguagens/c-cpp/calcular-pi-%5Bmonte-carlo%5D

#include <stdio.h>
#include <stdlib.h>
#include<gmp.h>
#define myrand ((float)(random())/(float)(RAND_MAX) ) //macro myrand: gera numeros float entre 0 e 1
int main(void)
{
	srandom(time(NULL)); // inicia o gerador de números aleatórios
	
	float x,y,teste;
	mpf_t Pt,Pi,pi;
	FILE *f;
	
	mpf_init(Pt);
	mpf_init(Pi);
	mpf_init(pi);
	mpf_set_prec (Pt,33300000);
	mpf_set_prec (Pi,33300000);
	mpf_set_prec (pi,33300000);
	mpf_set_d(Pi,0);
	//10000 operacoes consegue precisaos de 1 casa, 1000000->2, assim por diante (valores adquidos sequencialmente)
	for(mpf_set_d(Pt,0);mpf_cmp_d(Pt,100000000.0)<0; mpf_add_ui(Pt,Pt,1))
	{
		// o código é mto simplem, é praticamente igual o método citado no relatorio
		x=myrand;
		y=myrand;
		teste=(x*x)+(y*y);
		if(teste<=1)
			mpf_add_ui(Pi,Pi,1);
	}
	
	mpf_div(pi,Pi,Pt);
	mpf_mul_ui(pi,pi,4);
	f=fopen("saida.txt","w");
	gmp_fprintf (f, "%.10000000Ff\n",pi);
	return 0;
}

